package base.Chapter00_Structures.C04_Stack;

/**
 * 栈数据结构
 * 双向链表实现
 *
 * 属性列表：
 * 1， 栈底： head
 * 2， 栈顶：currentNode
 * 初始值指向哪里？
 *
 *
 * 功能列表：
 * 1， 压栈
 *  currentNode.setNext()
 *      第一个如何处理：head哨兵
 *
 * 2， 弹栈
 *  currentNode.getPre();
 *  preNode.setNext(null);
 *
 * 3,清空栈
 *  currentNode = head;
 */
public class Stack2 {
    private final Node head;
    private Node currentNode;

    public Stack2() {
        head = new Node(null);
        head.setPreNode(null);
        head.setNextNode(null);
        currentNode = head;
    }

    public void push(Object obj) {
        Node nextNode = new Node(obj);
        currentNode.setNextNode(nextNode);
        nextNode.setPreNode(currentNode);
        currentNode = nextNode;
    }

    public Object pop() {
        if (currentNode == head) {
            return null;
        }
        Object obj = currentNode.getContent();
        Node preNode = currentNode.getPreNode();
        preNode.setNextNode(null);
        currentNode = preNode;
        return obj;
    }

    public void clean() {
        currentNode = head;
    }
}
